package com.wiselink.coupang.productcatalog.ado;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.wiselink.coupang.productcatalog.request.PlatformProductItemRequestParam;
import com.wiselink.coupang.productcatalog.request.PlatformProductRequiredDocumentRequestParam;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * coupang商品注册参数
 *
 * @author malachi
 * @date 2024年12月16日17:31:25
 */
@Getter
@Setter
@ToString
public class PlatformProductADO {
    /**
     * 显示品类代码
     */
    @NotNull
    private Long displayCategoryCode;
//    /**
//     * 注册商品ID（商品注册接口返回）
//     */
//    private Long sellerProductId;
    /**
     * 注册商品名
     */
    @NotNull
    @Size(max = 100, message = "最大长度：100个字符")
    private String sellerProductName;
    /**
     * 卖家id
     */
    @NotNull
    private String vendorId;
    /**
     * 销售开始日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
    @NotNull
    private Date saleStartedAt;
    /**
     * 销售结束日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
    @NotNull
    private Date saleEndedAt;
    /**
     * 显示商品名
     */
    @Size(max = 100, message = "最大长度：100个字符")
    private String displayProductName;
    /**
     * 品牌
     */
    private String brand;
    /**
     * 商品名
     */
    private String generalProductName;
    /**
     * 商品群 即商品类型；输入商品群时，可参考显示品类的最下位名称。与商品名[generalProductName]重复时，无需输入
     */
    private String productGroup;
    /**
     * 配送方式
     *
     * <p>SEQUENCIAL 一般配送(依次发货)</p>
     * <p>COLD_FRESH 冷冻生鲜</p>
     * <p>MAKE_ORDER 订制</p>
     * <p>AGENT_BUY 代购</p>
     * <p>VENDOR_DIRECT 上门安装或卖家直接配送</p>
     * <p>INSTRUCTURE 上门安装</p>
     * <p>MAKE_ORDER_DIRECT 定制安装(卖家直接配送)</p>
     * <p>“INSTRUCTURE”及“MAKE_ORDER_DIRECT” 已合并为“VENDOR_DIRECT”。</p>
     * <p>若为生鲜食品，配送方式须选择冷冻生鲜，而不是一般配送。</p>
     */
    @NotNull
    private String deliveryMethod;
    /**
     * 物流公司代码  <a href="https://developers.coupangcorp.com/hc/en-us/articles/360034156033-Courier-Code">物流代码列表链接</a>
     */
    @NotNull
    private String deliveryCompanyCode;
    /**
     * 配送费类型
     * FREE 免费配送
     * <p>
     * NOT_FREE 付费配送
     * <p>
     * CHARGE_RECEIVED 运费到付
     * <p>
     * CONDITIONAL_FREE 指定条件包邮
     * <p>
     * 设置免费配送 设置初始退货运费(单程)[deliveryChargeOnReturn]及退货运费金额(单程)[returnCharge]
     * <p>
     * 设置付费配送 设置基本运费[deliveryCharge]及退货运费金额(单程)
     * <p>
     * 设置指定条件包邮 设置基本运费及退货运费金额(单程)
     * <p>
     * 设置运费到付(COD：collect on delivery) 我们已单独列出了符合运费到付条件的品类，并通过酷澎卖家客服中心分享，以指导卖家。
     * <p>
     * ※ 使用[CONDITIONAL_FREE]时，您可单独设置想要的指定条件包邮值。
     */
    @NotNull
    private String deliveryChargeType;
    /**
     * 基本运费
     * <p>
     * 若为付费配送或指定条件包邮，请输入单程运费值。
     */
    @NotNull
    @Min(value = 0, message = "最小值：0")
    private BigDecimal deliveryCharge;
    /**
     * 免运费门槛
     * <p>● 示例: 如果您想将指定条件包邮的门槛金额设置为10,000 韩元及以上，请先将[deliveryChargeType]设置为'CONDITIONAL_FREE'，然后在[freeShipOverAmount]中输入10000。</p>
     * <p>※ 输入单位须大于100韩元 (以100为增量)</p>
     * <p>※ 免费配送时，请输入0</p>
     */
    @NotNull
    @Min(value = 0, message = "最小值：0")
    private BigDecimal freeShipOverAmount;
    /**
     * 初始退货运费
     * <p>
     * 若为免费配送，则顾客支付退货运费
     */
    @NotNull
    @Min(value = 0, message = "最小值：0")
    private BigDecimal deliveryChargeOnReturn;
    /**
     * 偏远地区配送与否
     * <p>
     * Y	偏远地区可配送
     * <p>
     * N	偏远地区不配送
     */
    @NotNull
    @Size(max = 1, message = "最大长度：1个字符")
    private String remoteAreaDeliverable;
    /**
     * 捆绑配送与否
     * <p>
     * UNION_DELIVERY 可捆绑配送
     * <p>
     * NOT_UNION_DELIVERY 不可捆绑配送
     * <p>
     * ※ 捆绑配送条件
     * <p>
     * 必须输入发货地信息（只有发货地信息相同的商品才能捆绑配送）
     * <p>
     * 不可设置“不可运费到付”
     */
    @NotNull
    private String unionDeliveryType;
    /**
     * 退货中心代码
     * <p>
     * 创建退货地后，输入可取货的退货中心代码
     * <p>
     * 可通过Wing或“退货地创建 API”来创建退货地
     * <p>
     * 无法创建退货地时，可输入“NO_RETURN_CENTERCODE”，直接注册退货地信息
     * <p>
     * ※ 自动退货链接服务（Goodsflow）仅适用于签约物流公司，且必须输入退货中心代码。
     * <p>
     * ※ 若为海外配送商品，请务必输入韩国退货地址和签约物流公司代码，创建退货中心代码。*海外配送商品退货地指南(<a href="https://developers.coupangcorp.com/hc/en-us/articles/360023109273--Return-location-Can-I-list-my-products-without-contractor-courier-code">点击</a>)
     */
    @NotNull
    private String returnCenterCode;
    /**
     * 退货地名称
     * <p>
     * 通过酷澎WING或“退货地查询API”注册退货地后确认
     * <p>
     * “查询退货地时，输入shippingPlaceName的显示值”
     */
    @NotNull
    private String returnChargeName;
    /**
     * 退货地联系方式
     * <p>
     * 通过酷澎WING或“退货地查询API”注册退货地后确认
     */
    @NotNull
    private String companyContactNumber;
    /**
     * 退货地邮政编码
     * <p>
     * 通过酷澎WING或“退货地查询API”注册退货地后确认
     */
    @NotNull
    private String returnZipCode;
    /**
     * 退货地址
     * <p>
     * 通过酷澎WING或“退货地查询API”注册退货地后确认
     */
    @NotNull
    private String returnAddress;
    /**
     * 退货地详细地址
     * <p>
     * 通过酷澎WING或“退货地查询API”注册退货地后确认
     */
    @NotNull
    private String returnAddressDetail;
    /**
     * 退货运费
     * <p>
     * 回收退货商品时的单程运费
     * <p>
     * *只能输入初始退货运费100%～150%的值。【deliveryChargeOnReturn * 1 ~ 1.5】
     */
    @Min(value = 0, message = "最小值：0")
    @NotNull
    private BigDecimal returnCharge;
    /**
     * 发货地代码
     * <p>
     * 选择捆绑配送时必填。可通过“发货地查询API”进行查询
     * <p>
     * 选择海外代购（AGENT_BUY）时，只能输入海外地址。
     */
    @NotNull
    private String outboundShippingPlaceCode;
    /**
     * 是否自动申请批准
     * <p>
     * false : 只保存已填写的内容，审批未通过 （如果您想要销售商品，请通过“商品批准申请API”或WING进行申请）
     * <p>
     * true : 保存并自动申请批准销售
     */
    @NotNull
    private Boolean requested;
    /**
     * 卖家商品属性列表
     * <p>
     * 最多可注册200个属性
     */
    @NotNull
    @Size(min = 1, max = 200, message = "最多可注册200个属性")
    private List<PlatformProductItemRequestParam> items;
    /**
     * 必须提交所需文件时输入 文件须为小于 5MB 的文档（PDF、HWP、DOC、DOCX、TXT、PNG、JPG、JPEG）
     */
    private List<PlatformProductRequiredDocumentRequestParam> requiredDocuments;
    /**
     * 订制指南
     * <p>
     * 将配送方式选为“订制”时，请输入要发给顾客的信息
     */
    private String extraInfoMessage;
    /**
     * 制造商
     * <p>
     * 无法输入准确的制造商时，可输入与 [brand] 相同的内容
     */
    @NotNull
    private String manufacture;
//    /**
//     * 注册商品状态
//     */
//    private String statusName;
    /**
     * 电商店铺ID
     */
    @NotNull
    private Long shopId;
    /**
     * 真实用户id 该字段通过后端查询 shop.shopAccount
     */
    private String vendorUserId;
}
